######################################################################
# File: server/webserver.py                        Part of DjangoMUD #
#                                                                    #
# Copyright (C) 2010, Joachim Pileborg.                              #
# All rights reserved.                                               #
#                                                                    #
# Redistribution and use in source and binary forms, with or without #
# modification, are permitted provided that the following conditions #
# are met:                                                           #
#                                                                    #
#   o Redistributions of source code must retain the above copyright #
#     notice, this list of conditions and the following disclaimer.  #
#   o Redistributions in binary form must reproduce the above        #
#     copyright notice, this list of conditions and the following    #
#     disclaimer in the documentation and/or other materials         #
#     provided with the distribution.                                #
#   o Neither the name of the author nor the names of its            #
#     contributors may be used to endorse or promote products        #
#     derived from this software without specific prior written      #
#     permission.                                                    #
#                                                                    #
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND             #
# CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,        #
# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF           #
# MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE           #
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS  #
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,#
# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,           #
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR #
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY       #
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR     #
# TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF #
# THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF    #
# SUCH DAMAGE.                                                       #
######################################################################

from django.conf import settings

from djangomud.server.server import BaseServer
from djangomud import log

######################################################################

class WebServer(BaseServer):
    web_addr = settings.DEFAULT_HTTP_ADDR
    web_port = settings.DEFAULT_HTTP_PORT
    admin_media_path = ''

    def get_server_addr(self):
        addr_port = self.web_addr or ''
        addr_port = addr_port and addr_port + ':' + str(self.web_port) or 'port ' + str(self.web_port)
        return addr_port

    def run_web_server(self, handler):
        server_address = (self.web_addr, self.web_port)

        from django.core.servers.basehttp import WSGIServer, WSGIRequestHandler
        httpd = WSGIServer(server_address, WSGIRequestHandler)
        httpd.set_app(handler)

        log.web('Server running on %s' % self.get_server_addr())

        from djangomud.server.shutdown import shutdown_event
        while not shutdown_event.is_set():
            httpd.handle_request()

    def run(self):
        from django.core.servers.basehttp import AdminMediaHandler, WSGIServerException
        from django.core.handlers.wsgi import WSGIHandler

        try:
            handler = AdminMediaHandler(WSGIHandler(), self.admin_media_path)
            self.run_web_server(handler)
        except WSGIServerException as e:
            # Use helpful error messages instead of ugly tracebacks.
            ERRORS = {
                13: "You don't have permission to access that port.",
                98: "That port is already in use.",
                99: "That IP address can't be assigned-to.",
                }
            try:
                error_text = ERRORS[e.args[0].args[0]]
            except (AttributeError, KeyError):
                error_text = str(e)

            log.error('Error in webserver: %s' % error_text)

######################################################################

######################################################################
